#!/usr/bin/env python3
"""
目录结构审查MCP工具
审查项目目录结构规范
"""

import asyncio
from typing import Dict, Any
from pathlib import Path

from biz.cmd.func.directory import DirectoryReviewFunc
from biz.utils.dir_util import get_directory_tree


class DirectoryReviewTool:
    """
    目录结构审查工具
    审查项目目录结构的规范性
    """
    
    SUPPORTED_LANGUAGES = ["python", "java", "php", "vue"]
    
    def __init__(self):
        self.directory_func = None
    
    def _get_directory_func(self):
        """延迟初始化目录审查功能"""
        if self.directory_func is None:
            self.directory_func = DirectoryReviewFunc()
        return self.directory_func
    
    def validate_directory(self, directory: str) -> bool:
        """
        验证目录是否存在
        """
        try:
            return Path(directory).resolve().is_dir()
        except Exception:
            return False
    
    def validate_language(self, language: str) -> bool:
        """
        验证编程语言是否支持
        """
        return language in self.SUPPORTED_LANGUAGES
    
    def get_directory_structure(self, directory: str, max_depth: int = 3, only_dirs: bool = False) -> str:
        """
        获取目录结构
        """
        try:
            tree_structure = get_directory_tree(
                directory, 
                max_depth=max_depth, 
                only_dirs=only_dirs
            )
            return tree_structure
        except Exception as e:
            raise ValueError(f"获取目录结构失败: {str(e)}")
    
    def get_review_prompts(self, language: str, directory_structure: str) -> list[dict[str, str]]:
        """
        生成目录结构审查的提示词
        """
        system_prompt = f"""
你是一位资深的软件架构师，本次任务是对一个 {language.upper()} 项目的目录结构进行审查，具体要求如下：

### 具体要求：
1. **组织逻辑**: 评估目录结构是否清晰，是否符合 {language.upper()} 项目的常见组织规范
2. **命名规范性**: 检查目录和文件的命名是否清晰、一致，是否符合 {language.upper()} 的命名约定
3. **模块化程度**: 评估代码是否按功能或模块合理划分，是否存在过度耦合或冗余
4. **可维护性**: 分析目录结构是否易于扩展和维护，是否适合团队协作
5. **最佳实践**: 是否遵循 {language.upper()} 生态系统的最佳实践和约定

### {language.upper()} 项目常见结构规范：
"""
        
        # 根据不同语言添加特定的结构规范
        if language == "python":
            system_prompt += """
- **根目录**: 包含 setup.py/pyproject.toml, requirements.txt, README.md
- **源码目录**: 通常为项目名称或 src/
- **测试目录**: tests/ 或与源码并行的 test_*.py
- **文档目录**: docs/
- **配置目录**: config/ 或 conf/
- **静态资源**: static/, assets/
- **脚本目录**: scripts/ 或 bin/
"""
        elif language == "java":
            system_prompt += """
- **Maven结构**: src/main/java, src/main/resources, src/test/java
- **包结构**: com.company.project 形式的包命名
- **配置文件**: pom.xml 或 build.gradle
- **资源目录**: src/main/resources
- **测试目录**: src/test/java
"""
        elif language == "php":
            system_prompt += """
- **根目录**: composer.json, index.php
- **源码目录**: src/ 或 app/
- **公共目录**: public/ 或 web/
- **配置目录**: config/
- **模板目录**: templates/ 或 views/
- **供应商目录**: vendor/ (Composer)
"""
        elif language == "vue":
            system_prompt += """
- **根目录**: package.json, vue.config.js
- **源码目录**: src/
- **组件目录**: src/components/
- **页面目录**: src/views/ 或 src/pages/
- **路由目录**: src/router/
- **状态管理**: src/store/
- **静态资源**: src/assets/
- **公共目录**: public/
"""
        
        system_prompt += """

### 输出格式：
请按照以下Markdown格式输出review结果：

## 目录结构审查报告

### 📋 项目概览
[简要描述项目的整体结构特点]

### ✅ 优点
[列出目录结构的优点和符合规范的地方]

### ⚠️ 潜在问题
[指出目录结构中可能存在的问题]

#### 🔴 严重问题
[需要立即修复的结构问题]

#### 🟡 改进建议
[可以优化的结构安排]

#### 🔵 最佳实践建议
[符合行业标准的结构建议]

### 📊 评分
- 组织逻辑: X/10
- 命名规范: X/10
- 模块化程度: X/10
- 可维护性: X/10
- 最佳实践遵循: X/10

**总分: XX/50**

### 🎯 改进建议
[提供具体的目录结构优化建议]
"""
        
        user_prompt = f"""
请审查以下 {language.upper()} 项目的目录结构：

```
{directory_structure}
```
"""
        
        return [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ]
    
    async def execute(self, arguments: Dict[str, Any]) -> str:
        """
        执行目录结构审查
        """
        try:
            directory = arguments.get("directory")
            language = arguments.get("language")
            max_depth = arguments.get("max_depth", 3)
            only_dirs = arguments.get("only_dirs", False)
            
            if not directory or not language:
                return "错误: 缺少必需参数 directory 或 language"
            
            # 验证目录
            if not self.validate_directory(directory):
                return f"错误: 目录 '{directory}' 不存在或无法访问"
            
            # 验证编程语言
            if not self.validate_language(language):
                return f"错误: 不支持的编程语言 '{language}'，支持的语言: {', '.join(self.SUPPORTED_LANGUAGES)}"
            
            # 获取目录结构
            directory_structure = self.get_directory_structure(directory, max_depth, only_dirs)
            
            if not directory_structure:
                return "无法获取目录结构"
            
            # 获取目录审查功能实例
            directory_func = self._get_directory_func()
            
            # 设置参数
            directory_func.directory = directory
            directory_func.language = language
            directory_func.max_depth = max_depth
            directory_func.only_dirs = only_dirs
            
            # 生成提示词并调用LLM
            messages = self.get_review_prompts(language, directory_structure)
            
            # 异步调用LLM
            loop = asyncio.get_event_loop()
            review_result = await loop.run_in_executor(
                None, 
                directory_func.call_llm, 
                messages
            )
            
            # 清理结果格式
            if review_result.startswith("```markdown") and review_result.endswith("```"):
                review_result = review_result[11:-3].strip()
            
            return review_result
            
        except Exception as e:
            return f"目录结构审查执行失败: {str(e)}"